/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managedbean;

import applicationexcepcion.OrdineException;
import applicationexcepcion.OrdineQuantitaException;
import ejb.common.ProdottoManagerLocal;
import ejb.common.RepartoManagerLocal;
import ejb.common.SpeseSpedizioneManagerLocal;
import entity.DettaglioPrezzo;
import entity.Prodotto;
import entity.Reparto;
import entity.SpeseSpedizione;
import java.io.Serializable;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import utility.ExceptionThrower;
import utility.ResourceBundleLoader;

/**
 *
 * @author Carmela
 */
public class SpesaManager implements Serializable {

    @EJB
    private SpeseSpedizioneManagerLocal speseSpedizioneManager;
    @EJB
    private ProdottoManagerLocal prodottoManager;
    @EJB
    private RepartoManagerLocal repartoManager;
    private GestioneCliente cliente;
    private Redirect redirect;
    private CarrelloManager carrello;

    public CarrelloManager getCarrello() {
        return carrello;
    }

    public void setCarrello(CarrelloManager carrello) {
        this.carrello = carrello;
    }

    public List<Reparto> getReparti() {
        if (cliente == null) {
            throw new IllegalStateException("Il cliente deve essere settato");
        }
        if (cliente.getIdNegozio() == null) {
            return null;
        }
        List<Reparto> res = repartoManager.getRepartiFromNegozioConFornitura(cliente.getIdNegozio());
        return res;
    }

    public Integer getQuantitaNelCarrello(Prodotto p) {
        if (carrello == null) {
            throw new IllegalArgumentException();
        }
        return carrello.getQuantitaProdotto(p);
    }

    public List<Prodotto> prodottiDaVisualizzare(Reparto r) {
        if (this.cliente.getIdNegozio() == null) {
            return null;
        }
        return prodottoManager.getProdottiFromRepartoConFornitura(r.getId(), cliente.getIdNegozio());
    }

    public List<Prodotto> prodottiCarrello() {
        if (carrello == null) {
            throw new IllegalStateException("Bisogna settare il carrello");
        }
        List<Prodotto> res = carrello.getProdotti();
        return res;
    }

    /**
     * Get the value of redirect
     *
     * @return the value of redirect
     */
    public Redirect getRedirect() {
        return redirect;
    }

    /**
     * Restituisce il prezzo di un prodotto
     *
     * @param p
     * @return
     */
    public Float prezzoProdotto(Prodotto p) {
        if(cliente.getIdNegozio()==null){
            return new Float(0.00);
        }
        DettaglioPrezzo dp = prodottoManager.getPrezzoProdotto(cliente.getIdNegozio(), p.getCodiceBarre());
        return dp.getPrezzo();
    }

    /**
     * Set the value of redirect
     *
     * @param redirect new value of redirect
     */
    public void setRedirect(Redirect redirect) {
        this.redirect = redirect;
    }

    /**
     * Get the value of cliente
     *
     * @return the value of cliente
     */
    public GestioneCliente getCliente() {
        return cliente;
    }

    /**
     * Set the value of cliente
     *
     * @param cliente new value of cliente
     */
    public void setCliente(GestioneCliente cliente) {
        if (redirect == null) {
            throw new IllegalStateException("Bisogna settare prima il redirect");
        }
        this.cliente = cliente;
    }
    
    public void redirectFromSpesa(){
        if(cliente.getIdNegozio()==null){
            redirect.redirect("SelezioneNegozio.jsf");
        }
    }

    public void aggiungiAlCarrello(Prodotto p) {
        FacesContext fx = FacesContext.getCurrentInstance();
        ResourceBundle rb = ResourceBundleLoader.getResourceBundle(fx);
        try {
            if (carrello == null) {
                throw new IllegalStateException();
            }
            carrello.aggiungiProdottoAlCarrello(p, cliente.getIdNegozio(), 1);
            ExceptionThrower.throwMessageInfo(fx, rb, "prodottoAggiuntoSuccesso", p.getNome());
        } catch (OrdineQuantitaException ex) {
            ExceptionThrower.throwMessageError(fx, rb, "prodottoAggiuntoErrore");
        }
    }

    public void svuotaCarrello(){
        carrello.svuotaCarrello();
        ExceptionThrower.throwMessageInfo(FacesContext.getCurrentInstance(), ResourceBundleLoader.getResourceBundle(FacesContext.getCurrentInstance()), "svuotaCarrelloSuccesso");
    }
    
    public void rimuoviUnProdotto(Prodotto p) {
        if (carrello == null) {
            throw new IllegalStateException();
        }
        carrello.rimuoviUnProdotto(p, cliente.getIdNegozio());
        FacesContext fx = FacesContext.getCurrentInstance();
        ResourceBundle rb = ResourceBundleLoader.getResourceBundle(fx);
        ExceptionThrower.throwMessageInfo(fx, rb, "rimuoviProdottoCarrelloSuccesso", p.getNome());
    }

    public void riaggiungiProdotto(Prodotto p) {
        FacesContext fx = FacesContext.getCurrentInstance();
        ResourceBundle rb = ResourceBundleLoader.getResourceBundle(fx);
        try {
            if (carrello == null) {
                throw new IllegalStateException();
            }
            carrello.aggiungiProdottoAlCarrello(p, cliente.getIdNegozio(), 1);
            ExceptionThrower.throwMessageInfo(fx, rb, "prodottoAggiuntoSuccesso", p.getNome());
        } catch (OrdineQuantitaException ex) {
            ExceptionThrower.throwMessageInfo(fx, rb, "prodottoAggiuntoErrore");
        }

    }

    public void rimuoviProdotto(Prodotto p) {
        if (carrello == null) {
            throw new IllegalStateException();
        }
        carrello.rimuoviProdotto(p, cliente.getIdNegozio());
        FacesContext fx = FacesContext.getCurrentInstance();
        ResourceBundle rb = ResourceBundleLoader.getResourceBundle(fx);
        ExceptionThrower.throwMessageInfo(fx, rb, "prodottoAggiuntoSuccesso", p.getNome());
    }

    public float getTotale() {
        if (cliente == null) {
            throw new IllegalStateException();
        }
        if (cliente.getIdNegozio() == null) {
            return (float) 0.00;
        }
        return carrello.getTotale(getSpeseSpedizione());
    }

    public SpeseSpedizione getSpeseSpedizione() {
        if (cliente == null) {
            throw new IllegalStateException();
        }
        if (cliente.getIdNegozio() == null) {
            SpeseSpedizione ss = new SpeseSpedizione();
            ss.setPrezzo(new Float(0.00));
            return ss;
        }
        return speseSpedizioneManager.getSpeseSpedizione(cliente.getIdNegozio());
    }

    public String indietroDaCarrello() {
        if (cliente.getIdNegozio() == null) {
            return "SelezioneNegozio";
        }
        return "Spesa";
    }
    
    public String ordina(){
        if(!cliente.isLogged()){
            return "Login";
        }
        if(carrello.isEmpty()){
            return "";
        }
        FacesContext fc=FacesContext.getCurrentInstance();
        ResourceBundle rb=ResourceBundleLoader.getResourceBundle(fc);
        try {
            carrello.processaOrdine(cliente.getId(), getSpeseSpedizione());
            ExceptionThrower.throwMessageInfo(fc, rb, "ordineProcessatoSuccesso");
        } catch (OrdineException ex) {
            String s = ex.getMessage();
            Long idProdotto = Long.parseLong(s);
            Prodotto p = prodottoManager.cercaPerId(idProdotto);
            ExceptionThrower.throwMessageError(fc, rb, "ordineProcessatoError",p.getNome());
            return "";
        }
        return "GestioneCliente";
    }

    /**
     * Creates a new instance of SpesaManager
     */
    public SpesaManager() {
    }
}
